import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class Exercise {
    // 成员变量
    private String title; // 习题标题（如"一年级加法练习"）
    private List<AbstractExpression> expressions; // 存储抽象算式（依赖抽象，符合依赖倒置原则）


    // 构造方法：初始化习题标题和算式列表
    public Exercise(String title) {
        this.title = title;
        this.expressions = new ArrayList<>();
    }


    // 4.2 产生指定数量的通用算式（核心通用方法，通过反射创建具体算式实例）
    /**
     * 生成指定数量的某种类型的算式（如加法、减法）
     * @param count 算式数量
     * @param clazz 算式类型（需继承AbstractExpression，如AddExpression.class）
     */
    private void generateExpressions(int count, Class<? extends AbstractExpression> clazz) {
        if (count <= 0) {
            throw new IllegalArgumentException("算式数量必须为正整数");
        }
        Random random = new Random();
        for (int i = 0; i < count; i++) {
            // 生成0-100的随机整数作为操作数（可根据需求调整范围）
            double num1 = random.nextInt(101);
            double num2 = random.nextInt(101);
            try {
                // 通过反射创建具体算式实例（避免硬编码，符合开放封闭原则）
                AbstractExpression exp = clazz.getConstructor(double.class, double.class).newInstance(num1, num2);
                expressions.add(exp);
            } catch (Exception e) {
                throw new RuntimeException("生成算式失败：" + e.getMessage());
            }
        }
    }


    // 4.5 产生指定数量的加法算式（调用通用生成方法）
    /**
     * 生成指定数量的加法算式
     * @param count 加法算式数量（正整数）
     */
    public void generateAddExpressions(int count) {
        generateExpressions(count, AddExpression.class);
    }


    // 4.4 产生指定数量的减法算式（调用通用生成方法）
    /**
     * 生成指定数量的减法算式
     * @param count 减法算式数量（正整数）
     */
    public void generateSubtractExpressions(int count) {
        generateExpressions(count, SubtractExpression.class);
    }


    // 4.3 格式化显示习题详情（标题+所有算式）
    /**
     * 以格式化字符串形式返回习题详情
     * @return 格式化的习题信息（包含标题、题目数量、每个题目内容）
     */
    public String getFormattedDisplay() {
        StringBuilder sb = new StringBuilder();
        sb.append("===== ").append(title).append(" =====\n");
        sb.append("共").append(expressions.size()).append("道题：\n");
        for (int i = 0; i < expressions.size(); i++) {
            // 调用抽象算式的getExpression()方法（多态特性）
            sb.append(i + 1).append(". ").append(expressions.get(i).getExpression()).append("\n");
        }
        return sb.toString();
    }


    // Getter方法（封装成员变量）
    public String getTitle() {
        return title;
    }

    public List<AbstractExpression> getExpressions() {
        return new ArrayList<>(expressions); // 返回副本，避免外部直接修改内部列表
    }

}
